package util

import (
	"container/list"
	"time"
)

// DelayItem 定义一个结构体，包含延时任务的数据和执行时间
type DelayItem struct {
	data      interface{}
	executeAt time.Time
}

// DelayQueue 延时队列结构体
type DelayQueue struct {
	queue *list.List
}

// NewDelayQueue 创建一个新的延时队列
func NewDelayQueue() *DelayQueue {
	return &DelayQueue{
		queue: list.New(),
	}
}

// Push 添加一个新的延时任务
func (dq *DelayQueue) Push(data interface{}, delay time.Duration) {
	executeAt := time.Now().Add(delay)
	item := &DelayItem{
		data:      data,
		executeAt: executeAt,
	}
	for e := dq.queue.Front(); e != nil; e = e.Next() {
		if item.executeAt.Before(e.Value.(*DelayItem).executeAt) {
			dq.queue.InsertBefore(item, e)
			return
		}
	}
	dq.queue.PushBack(item)
}

// Pop 获取并移除队列中最早达到执行时间的任务
func (dq *DelayQueue) Pop() *DelayItem {
	for {
		e := dq.queue.Front()
		if e == nil {
			time.Sleep(100 * time.Millisecond) // 队列为空，暂停一段时间
			continue
		}
		item := e.Value.(*DelayItem)
		if time.Now().After(item.executeAt) {
			dq.queue.Remove(e)
			return item
		}
		time.Sleep(100 * time.Millisecond) // 最早任务还没到执行时间，暂停一段时间
	}
}
